#pragma once
#include "stdafx.h"
#include "TipoDato.h"
#include "Sentencia.h"
class CasoList
{
public:

	CasoList(CasoList * next,vector<TipoDato*> tipodato,Sentencia *instrucciones)
	{
		this->next=next;
		this->tipodato = tipodato;
		this->instrucciones = instrucciones;
	}

	~CasoList(void)
	{
	}

	void setNext(CasoList * next){
		this->next=next;
	}
	void setTipodato(vector<TipoDato*> tipodato){
		this->tipodato=tipodato;
	}
	void setInstrucciones(Sentencia *instrucciones){
		this->instrucciones=instrucciones;
	}

	CasoList * getNext(){
		return this->next;
	}

	vector<TipoDato*> getTipodato(){
		return this->tipodato;
	}

	Sentencia* getInstrucciones(){
		return this->instrucciones;
	}

	void setVariable(tipo_ts* variable){
		this->variable=variable;
	}

	tipo_ts* getVariable(){
		return this->variable;
	}
	tipo_ts * validarSemantica(tabla_simbolos *tabla_de_tipo,tabla_simbolos *tabla_de_varaible){
		for(int i=0;i<this->tipodato.size();i++){
			tipo_ts *tts = this->tipodato.at(i)->validarSemantica(tabla_de_tipo,tabla_de_varaible);
			if(tts != this->getVariable()){
				stringstream out;
				out<<"EL tipo de dato del label es incorrecto"<<endl;
				throw exception(out.str().c_str());
			}
		}
		if(this->instrucciones!=0){
			this->instrucciones->validarSemantica(tabla_de_tipo,tabla_de_varaible);
		}
		if(this->getNext()!=0){
		this->getNext()->setVariable(this->getVariable());
		this->getNext()->validarSemantica(tabla_de_tipo,tabla_de_varaible);
		}
		return 0;
	}

private:
	CasoList *next;
	vector<TipoDato*> tipodato;
	Sentencia *instrucciones;
	tipo_ts* variable;
};

